#include <iostream>
#include <cstring>
using namespace std;

const int N = 1010;

int n, m;       //存储货物数量和容量
int v[N], w[N]; //货物信息
int f[N];       //滚动数组去一层

int main()
{
    freopen("cin.txt", "r", stdin);
    memset(f, 0, sizeof f);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        cin >> v[i] >> w[i];
    for (int i = 1; i <= n; ++i)                  //更新n次，每次滚一层，滚到第几层就代表里面装前几个
        for (int j = v[i]; j <= m; ++j)           //从容积为v[i]开始更新因为前面的没得比。这次是从前往后，因为递推需要用到本层的东西
            f[j] = max(f[j], f[j - v[i]] + w[i]); //那么就两个进行比较
    cout << f[m];
    return 0;
}